package com.zjb.demo.system.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.zjb.demo.system.domain.SysConfig;
import com.zjb.demo.system.domain.dto.SysConfigPageQueryDto;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Optional;

import static com.zjb.demo.system.domain.table.SysConfigTableDef.SYS_CONFIG;

/**
 * 系统配置 mapper
 *
 * @author 庄佳彬
 * @since 2023/12/27 14:27
 */
@Mapper
public interface SysConfigMapper extends BaseMapper<SysConfig> {
    /**
     * 根据键值选中指定的SysConfig对象。
     *
     * @param key 键值
     * @return 与指定键值匹配的SysConfig对象的Optional包装，如果不存在则为空Optional
     */
    default Optional<SysConfig> selectByKey(String key) {
        return QueryChain.of(this)
                .select(SYS_CONFIG.DEFAULT_COLUMNS)
                .from(SYS_CONFIG)
                .where(SYS_CONFIG.CONFIG_KEY.eq(key))
                .one();
    }


    /**
     * 根据给定的查询条件分页查询系统配置列表
     *
     * @param dto 查询条件
     * @return 分页结果
     */
    default Page<SysConfig> pageList(SysConfigPageQueryDto dto) {
        var chain = getQueryChain(dto);
        return chain.page(dto.page());
    }

    private QueryChain<SysConfig> getQueryChain(SysConfigPageQueryDto dto) {
        return QueryChain.of(this)
                .select(SYS_CONFIG.ALL_COLUMNS)  // 查询所有列
                .from(SYS_CONFIG)  // 从系统配置表中查询
                .where(SYS_CONFIG.CONFIG_NAME.like(dto.configName()))  // 根据配置名称模糊查询
                .and(SYS_CONFIG.CONFIG_KEY.like(dto.configKey()))  // 根据配置键值模糊查询
                .and(SYS_CONFIG.CONFIG_TYPE.eq(dto.configType()))  // 根据配置类型查询
                .and(SYS_CONFIG.CREATE_TIME.ge(dto.start()))  // 根据创建时间大于等于指定时间查询
                .and(SYS_CONFIG.CREATE_TIME.le(dto.end()))  // 根据创建时间小于等于指定时间查询
                .orderBy(SYS_CONFIG.CREATE_TIME.desc());
    }


    /**
     * 根据给定的查询条件查询系统配置列表
     *
     * @param sysConfigPageQueryDto 查询条件
     * @return 系统配置列表
     */
    default List<SysConfig> list(SysConfigPageQueryDto sysConfigPageQueryDto) {
        return getQueryChain(sysConfigPageQueryDto).list();
    }

}
